package com.safe.utils;

import org.apache.commons.lang.StringUtils;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * redis操作工具类
 * Created by 涂奕恒 on 2018/3/21.
 */
@Component("redisCache")
public class RedisCacheUtil {

    @Resource
    private StringRedisTemplate redisTemplate;

    /**
     * 向Hash中添加值
     *
     * @param key   可以对应数据库中的表名
     * @param field 可以对应数据库表中的唯一索引
     * @param value 存入redis中的值
     */
    public void hSet(String key, String field, String value) {
        if (StringUtils.isBlank(key) || StringUtils.isBlank(field)) {
            return;
        }

        redisTemplate.opsForHash().put(key, field, value);
    }

    /**
     * 从redis中取出值
     *
     * @param key   可以对应数据库中的表名
     * @param field 可以对应数据库表中的唯一索引
     * @return 从redis中取出的值
     */
    public String hGet(String key, String field) {
        if (StringUtils.isBlank(key) || StringUtils.isBlank(field)) {
            return null;
        }
        return (String) redisTemplate.opsForHash().get(key, field);
    }

    /**
     * 判断 是否存在 key 以及 hash key
     *
     * @param key   可以对应数据库中的表名
     * @param field 可以对应数据库表中的唯一索引
     * @return 是否存在 key 以及 hash key
     */
    public boolean hExists(String key, String field) {
        if (StringUtils.isBlank(key) || StringUtils.isBlank(field)) {
            return false;
        }
        return redisTemplate.opsForHash().hasKey(key, field);
    }

    /**
     * 查询 key中对应多少条数据
     *
     * @param key 可以对应数据库中的表名
     * @return key中对应多少条数据
     */
    public long hSize(String key) {
        if (StringUtils.isBlank(key)) {
            return 0L;
        }
        return redisTemplate.opsForHash().size(key);
    }

    /**
     * 删除
     *
     * @param key   可以对应数据库中的表名
     * @param field 可以对应数据库表中的唯一索引
     */
    public void hDel(String key, String field) {
        if (StringUtils.isBlank(key) || StringUtils.isBlank(field)) {
            return;
        }
        try {
            if (redisTemplate.opsForHash().hasKey(key, field)) {
                redisTemplate.opsForHash().delete(key, field);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}